// router/router.go
package router

import (
	"io/fs"
	"log"
	"net/http"

	goscanmgt "goscan-mgt"
	"goscan-mgt/controller"
	"goscan-mgt/docs"

	"github.com/gin-gonic/gin"
)

// SetupRoutes 设置路由
func SetupRoutes() *gin.Engine {
	// 创建一个新的Gin引擎
	r := gin.Default()
	docs.InitSwagger(r)

	// API 路由组
	api := r.Group("/api")
	{
		// 设置服务信息相关的路由
		serviceInfoController := controller.NewServiceInfoController()
		api.GET("/service_info", serviceInfoController.GetAllServiceInfo)        // 获取所有服务信息列表
		api.GET("/service_info/:id", serviceInfoController.GetServiceInfoById)   // 根据ID获取服务信息
		api.POST("/service_info", serviceInfoController.CreateServiceInfo)       // 创建服务信息
		api.PUT("/service_info/:id", serviceInfoController.UpdateServiceInfo)    // 更新服务信息
		api.DELETE("/service_info/:id", serviceInfoController.DeleteServiceInfo) // 删除服务信息

		// 设置扫描结果相关的路由
		scanController := controller.NewScanController()
		api.GET("/scan_result", scanController.GetAllScanResults)                             // 获取所有扫描结果列表
		api.GET("/scan_result/:id", scanController.GetScanResultByID)                         // 根据ID获取扫描结果
		api.GET("/scan_result/project/:project_id", scanController.GetScanResultsByProjectID) // 根据项目ID获取扫描结果列表
		api.POST("/scan_result", scanController.CreateScanResult)                             // 创建扫描结果
		api.PUT("/scan_result/:id", scanController.UpdateScanResult)                          // 更新扫描结果
		api.DELETE("/scan_result/:id", scanController.DeleteScanResult)                       // 删除扫描结果

		// 设置项目相关的路由
		projectController := controller.NewProjectController()
		api.GET("/project/start", projectController.StartScan)                // 开始扫描
		api.GET("/project", projectController.GetAllProjects)                 // 获取所有项目列表
		api.GET("/project/:id", projectController.GetProjectById)             // 根据ID获取项目
		api.POST("/project", projectController.CreateProject)                 // 创建项目
		api.PUT("/project/:id", projectController.UpdateProject)              // 更新项目
		api.PUT("/project/:id/status", projectController.UpdateProjectStatus) // 更新项目状态
		api.DELETE("/project/:id", projectController.DeleteProject)           // 删除项目
	}

	// 嵌入Vite静态资源
	distServer, err := fs.Sub(goscanmgt.DistFS, "static/dist")
	if err != nil {
		log.Fatalf("Failed to create sub filesystem: %v", err)
	}

	// 直接暴露 dist 下所有静态文件（svg、ico、js、css等）
	staticFiles := []string{
		"favicon.ico", "file.svg", "globe.svg", "next.svg", "vercel.svg", "window.svg", "vite.svg",
		"assets/index-CRN94UTg.css", "assets/index-TXwMSodK.js", "index.html", "default.html",
	}
	for _, fname := range staticFiles {
		r.GET("/"+fname, func(fname string) gin.HandlerFunc {
			return func(c *gin.Context) {
				c.FileFromFS(fname, http.FS(distServer))
			}
		}(fname))
	}

	// SPA fallback
	r.NoRoute(func(c *gin.Context) {
		c.FileFromFS("default.html", http.FS(distServer))
	})

	return r
}
